package com.sxj.corejava.code08_常用类.内部类;


/**
 * @author 石小俊
 * @date 2024年04月23日 19:06
 */
public class Test01_成员内部类 {
    public static void main(String[] args) {
        // 对于外部类,直接实例化即可
        Outer outer = new Outer();
//        outer.show();
        // 对于内部类,如果在非外部类中定义
        // 语法:外部类.内部类 变量名 = 外部类对象.new 内部类();
        Outer.Inner inner = outer.new Inner();
        // 在非外部类中访问内部类的成员
        // 可以访问所有非private修饰的成员
//        System.out.println(inner.getName());
//        System.out.println(inner.getGender());
        // 不能访问private修饰的成员
        // inner.name = "tom"; // 报错
        inner.print();
    }
}

class Outer {
    private static String name = "admin";
    private int age;

    public static String getName() {
        return name;
    }

    public static void setName(String name) {
        Outer.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void show() {
        // 在外部类中定义该外部类所包含的内部类时
        // 可以直接定义
        Inner inner = new Inner();
        // 在外部类中访问内部类的成员时,可以访问任意的内部类成员
        // 包含private修饰的成员
        System.out.println(inner.getName());
        System.out.println(inner.getGender());
        inner.setName("jack");
        inner.setGender("男");
        System.out.println("访问外部类属性:" + inner.name);
        System.out.println("访问外部类属性:" + inner.gender);
    }

    class Inner {
        // 在成员内部类中不能定义静态变量
        private String name = "alice";
        private String gender;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getGender() {
            return gender;
        }

        public void setGender(String gender) {
            this.gender = gender;
        }

        public void print() {
            // 在内部类中实例化外部类,正常实例化即可
            Outer outer = new Outer();
            // 在内部类中访问外部类成员
            // 如果访问的成员名字与内部类重名了,则默认访问的是内部类的
            System.out.println("访问内部类属性:" + name);
            // 如果没有重名,则正常访问
            System.out.println("访问内部类属性:" + age);
            System.out.println("访问外部类属性:" + Outer.name);
            System.out.println("访问外部类属性:" + outer.age);
        }
    }
}

